/**
 * 构造N个点M条边的无向图，使得1到i的最短距离为Ai。
 * 首先对A排序，然后做层次图。每一层均与上一层的第一个节点相连
 * 这样就保证了Ai是i的最短距离。
 * 如果边的数量仍然没有达到M，我们还有两种方法连边：
 * 1. 同层之间两两连边
 * 2. 相邻上下层两两连边
 * 如果还达不到，则cant。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

template <typename T>
const T & mymax(const T & a, const T & b){
    return max(a, b);
}

template<typename T, typename ... Args>
const T & mymax(const T & t, const Args & ... args){
    return max(t, mymax(args ...));
}

template<typename T>
void input(vector<T> & v, int n){
	v.assign(n + 1, {});
    for(int i=1;i<=n;++i) cin >> v[i];
	return;
}

template<typename T>
istream & operator >> (istream & is, vector<T> & v){
	for(auto & i : v) is >> i;
	return is;
}

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;

int N;
int M;
vector<pair<int, int>> A;
vector<pair<int, int>> Edges;
vector<pair<int, int>> Candi;
vector<vi> L;

void proc(){
    if(M + 1 < N) return (void)(cout << "-1\n");

    sort(A.begin() + 1, A.end());
    assert(A[1].first == 0);

    L.emplace_back(vi(1, A[1].second));
    for(int i=2;i<=N;++i){
        if(A[i].first == L.size() - 1){
            L.back().emplace_back(A[i].second);
        }else if(A[i].first == L.size()){
            L.emplace_back(vi(1, A[i].second));
        }else{
            return (void)(cout << "-1\n");
        }
    }

    Edges.clear(); Edges.reserve(M);
    for(int i=1;i<L.size();++i){
        int u = L[i - 1].front();
        for(auto v : L[i]){
            Edges.emplace_back(u, v);
        }
    }
    if(Edges.size() > M) return (void)(cout << "-1\n");

    int left = M - Edges.size();
    if(0 == left) goto L;

    for(const auto & vec : L){
        for(int i=0;i<vec.size();++i){
            for(int j=i+1;j<vec.size();++j){
                Edges.emplace_back(vec[i], vec[j]);
                if(--left == 0){
                    goto L;
                }                
            }
        }
    }

    for(int i=1;i<L.size();++i){
        const auto & prev = L[i-1];
        const auto & curv = L[i];

        for(int j=1;j<prev.size();++j){
            for(auto k : curv){
                Edges.emplace_back(prev[j], k);
                if(--left == 0){
                    goto L;
                }
            }
        }
    }
    L:
    if(Edges.size() < M) return (void)(cout << "-1\n");
    assert(Edges.size() == M);
    for(const auto & p : Edges) cout << p.first << " " << p.second << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);   
    cin >> N >> M;
    A.assign(N + 1, {});
    for(int i=1;i<=N;++i){
        cin >> A[A[i].second = i].first;
    }
    proc();
    return 0;
}